package vf2.rn;

/************************************************************************
  			VF2_RN_Espera.java

    BattleField Tactics Online - A Strategy RPG Online Game
    Copyright (C) 2008  
	Douglas Ribeiro, Kely Marques Rosa, Rodrigo da Fonseca Lacerda

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.

	Contact: douglas666@gmail.com
 **************************************************************************/


import java.rmi.RemoteException;
import java.util.*;

import vf1.so.VF1_SO_IClienteRMI;
import vf2.so.*;
import vf2.ip.*;

/**
 * Class VF2_RN_Espera
 */
public class VF2_RN_Espera {

	//
	// Fields
	//

	private List<String> espera = new ArrayList<String>();
	private List<VF2_RN_Jogador> lista_jogadores = new ArrayList<VF2_RN_Jogador>(); 
	private VF2_RN_Jogador jogador1;
	private VF2_RN_Jogador jogador2;
	private VF2_RN_Jogador jogador3;
	private VF2_RN_Jogador jogador4;

	private VF2_RN_Batalha batalha;
	
	//
	// Constructors
	//
	public VF2_RN_Espera () { };

	//
	// Methods
	//


	//
	// Accessor methods
	//

	/**
	 * Set the value of espera
	 * @param newVar the new value of espera
	 */
	private void setEspera ( List<String> newVar ) {
		espera = newVar;
	}

	/**
	 * Get the value of espera
	 * @return the value of espera
	 */
	private List<String> getEspera ( ) {
		return espera;
	}

	/**
	 * Set the value of jogador1
	 * @param newVar the new value of jogador1
	 */
	private void setJogador1 ( VF2_RN_Jogador newVar ) {
		jogador1 = newVar;
	}

	/**
	 * Get the value of jogador1
	 * @return the value of jogador1
	 */
	private VF2_RN_Jogador getJogador1 ( ) {
		return jogador1;
	}

	/**
	 * Set the value of jogador2
	 * @param newVar the new value of jogador2
	 */
	private void setJogador2 ( VF2_RN_Jogador newVar ) {
		jogador2 = newVar;
	}

	/**
	 * Get the value of jogador2
	 * @return the value of jogador2
	 */
	private VF2_RN_Jogador getJogador2 ( ) {
		return jogador2;
	}

	/**
	 * Set the value of jogador3
	 * @param newVar the new value of jogador3
	 */
	private void setJogador3 ( VF2_RN_Jogador newVar ) {
		jogador3 = newVar;
	}

	/**
	 * Get the value of jogador3
	 * @return the value of jogador3
	 */
	private VF2_RN_Jogador getJogador3 ( ) {
		return jogador3;
	}

	/**
	 * Set the value of jogador4
	 * @param newVar the new value of jogador4
	 */
	private void setJogador4 ( VF2_RN_Jogador newVar ) {
		jogador4 = newVar;
	}

	/**
	 * Get the value of jogador4
	 * @return the value of jogador4
	 */
	private VF2_RN_Jogador getJogador4 ( ) {
		return jogador4;
	}

	//
	// Other methods
	//

	/**
	 * @param        jogador
	 */
	public void inserirNaListaEspera( VF2_RN_Jogador jogador )
	{
		/*insere jogador na lista de espera;
    if (lista.size == 4) {
      this.limpalistaEspera();
      VF2_RN_Batalha batalha = new VF2_RN_Batalha();
      batalha.iniciarBatalha(lista_de_espera);
    }
		 */

		int tamanho_lista = getLista_jogadores().size();
		if(tamanho_lista<=3) {
			getLista_jogadores().add(jogador);
			getEspera().add(jogador.getNome());
		}
		tamanho_lista= getLista_jogadores().size();
		System.out.printf("\n \n tamanho da lista eh: %d \n \n",getLista_jogadores().size());

		if (tamanho_lista>=1){
			setJogador1((VF2_RN_Jogador)getLista_jogadores().get(0));
		}
		if (tamanho_lista>=2) {
			setJogador2((VF2_RN_Jogador)getLista_jogadores().get(1));
		}
		if (tamanho_lista>=3) {
			setJogador3((VF2_RN_Jogador)getLista_jogadores().get(2));
		}
		if (tamanho_lista==4) {
			setJogador4((VF2_RN_Jogador)getLista_jogadores().get(3));
		}

		
		if(tamanho_lista==4){
			batalha= new VF2_RN_Batalha();
			List<VF2_RN_Jogador> lista_provisoria= new ArrayList<VF2_RN_Jogador>();
			List<String> lista_provisoria_nome = new ArrayList<String>();

			lista_provisoria.add(getLista_jogadores().get(0));
			lista_provisoria.add(getLista_jogadores().get(1));
			lista_provisoria.add(getLista_jogadores().get(2));
			lista_provisoria.add(getLista_jogadores().get(3));

			lista_provisoria_nome.add(getEspera().get(0));	
			lista_provisoria_nome.add(getEspera().get(1));
			lista_provisoria_nome.add(getEspera().get(2));
			lista_provisoria_nome.add(getEspera().get(3));

			this.limpaListaEspera();
			batalha.iniciarBatalha(lista_provisoria,lista_provisoria_nome); //mudar para a lista de jogadores

		}

	}


	/**
	 * @param        lista_de_espera
	 */
	public void enviarLista( /*List lista_de_espera*/ ) //Mudado parâmetro desse método
	{
		//MA: envia a lista por RMI para vf1;
		VF2_SO_BFTServidor servidor = VF2_SO_BFTServidor.getServidor();
		VF2_SO_ServidorRMI servidorrmi = servidor.getServidorRMI();
		HashMap<String, VF1_SO_IClienteRMI> lista_de_clientes = VF2_SO_ServidorRMI.getClientesRemotos();


		int tamanho_lista = getLista_jogadores().size();
		if (tamanho_lista>=1)
			try {
				lista_de_clientes.get(jogador1.getIp()).receberListaEspera(getEspera());
			} catch (RemoteException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

			if (tamanho_lista>=2)
				try {
					lista_de_clientes.get(jogador2.getIp()).receberListaEspera(getEspera());
				} catch (RemoteException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}

				if (tamanho_lista>=3)
					try {
						lista_de_clientes.get(jogador3.getIp()).receberListaEspera(getEspera());
					} catch (RemoteException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}

					if (tamanho_lista>=4)
						try {
							lista_de_clientes.get(jogador4.getIp()).receberListaEspera(getEspera());
						} catch (RemoteException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
	}


	/**
	 */
	public void limpaListaEspera(  )
	{
		getEspera().remove(3);
		getEspera().remove(2);
		getEspera().remove(1);
		getEspera().remove(0);
		getLista_jogadores().remove(3);
		System.out.printf("\n \n tamanho da lista deve ser 3, mas eh: %d \n \n",getLista_jogadores().size());
		getLista_jogadores().remove(2);
		getLista_jogadores().remove(1);
		getLista_jogadores().remove(0);

		//MA:  limpa a lista de espera;		
	}

	public List<VF2_RN_Jogador> getLista_jogadores() {
		return lista_jogadores;
	}

	public void setLista_jogadores(List<VF2_RN_Jogador> lista_jogadores) {
		this.lista_jogadores = lista_jogadores;
	}

	public VF2_RN_Batalha getBatalha() {
		return batalha;
	}

	public void setBatalha(VF2_RN_Batalha batalha) {
		this.batalha = batalha;
	}


}
